<?php

class Plugin_Wechat extends \Base\Plugin\Base
{
    public function routerShutdown(\Yaf\Request_Abstract $request, \Yaf\Response_Abstract $response)
    {
        static::iterativeRoute($request);
    }

    /**
     * 迭代的Route
     *
     * Module的控制器只能有Module/Controller/Action三层,比如/wechat/message/会去wechat模块
     * 中去找控制器Controller_Message,然后调用其IndexAction.
     *
     *
     * 如果请求的URI是/wechat/message/handler/account,请求则会被转发到app/controllers/,
     * 而不是app/modules里去找控制器.
     *
     * 这个方法是来解决这个问题的.这个方法可以使传入的/wechat/path/path/path/action去
     * modules/wechat/controllers/Path/Path/Path/Action.php中去找Controller_Path_Path_Path_Action类.
     *
     * 本来想通过实现\Yaf\Route_Interface去解决这个问题,但是不知道为什么总是不能运行.所以先通过
     * 插件在routerShutdown()事件中处理一下.
     *
     * @param \Yaf\Request_Abstract $request
     *
     * @return null
     */
    protected static function iterativeRoute(\Yaf\Request_Abstract $request)
    {
        $uri = explode('/', ltrim($request->getRequestUri(), '/'));

        //如果$url长度不超过3,则其分别对应Module\Controller\Action,就不需要特殊处理了.
        if (count($uri) < 4) {
            return null;
        }

        $request->setModuleName(ucfirst(array_shift($uri)));
        $request->setActionName(\Yaf\Application::app()->getConfig()->get('yaf.dispatcher.defaultAction'));

        array_walk($uri, function (&$path) { $path = ucfirst($path); });
        $request->setControllerName(implode('_', $uri));
    }

}